﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;
using MYTech.Oracle;

namespace MYTech.Data.Oracle
{
    /// <summary>
    /// 数据库表集合类
    /// </summary>
    public class TableCollection<T> : IList<T>, ICollection<T>, IEnumerable<T>, IEnumerable
    {
        private List<T> items;
        public TableCollection()
            : this(null)
        {
        }

        /// <summary>
        /// 文件路径
        /// </summary>
        public string FilePath
        {
            get;
            set;
        }

        /// <summary>
        /// 文件名
        /// </summary>
        public string FileName
        {
            get
            {
                if (!string.IsNullOrEmpty(FilePath))
                    return Path.GetFileName(FilePath);
                return null;
            }
        }

        public TableCollection(string filePath)
        {
            this.FilePath = filePath;
            this.items = new List<T>();
        }

        /// <summary>
        /// 搜索指定的对象，并返回整个 TableCollection&lt;T&gt; 中第一个匹配项的从零开始的索引。
        /// </summary>
        /// <param name="item"></param>
        /// <returns></returns>
        public int IndexOf(T item)
        {
            Table table = item as Table;
            for (int index = 0; index < items.Count; index++)
            {
                Table _table = items[index] as Table;
                if (_table.TableName.Equals(table.TableName))
                    return index;
            }
            return -1;
        }

        /// <summary>
        /// 将元素插入 TableCollection&lt;T&gt; 的指定索引处。
        /// </summary>
        /// <param name="index"></param>
        /// <param name="item"></param>
        public void Insert(int index, T item)
        {
            items.Insert(index, item);
        }

        /// <summary>
        /// 移除 TableCollection&lt;T&gt; 的指定索引处的元素。
        /// </summary>
        /// <param name="index"></param>
        public void RemoveAt(int index)
        {
            items.RemoveAt(index);
        }

        /// <summary>
        /// 获取或设置指定索引处的元素。
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        public T this[int index]
        {
            get
            {
                return items[index];
            }
            set
            {
                items[index] = value;
            }
        }

        /// <summary>
        /// 将对象添加到 TableCollection&lt;T&gt; 的结尾处。
        /// </summary>
        /// <param name="item"></param>
        public void Add(T item)
        {
            items.Add(item);
        }

        /// <summary>
        /// 从 TableCollection&lt;T&gt; 中移除所有元素。
        /// </summary>
        public void Clear()
        {
            items.Clear();
        }

        /// <summary>
        /// 确定某元素是否在 TableCollection&lt;T&gt; 中。
        /// </summary>
        /// <param name="item"></param>
        /// <returns></returns>
        public bool Contains(T item)
        {
            return this.IndexOf(item) != -1;
        }

        /// <summary>
        /// 将整个 TableCollection&lt;T&gt; 复制到兼容的一维数组中，从目标数组的指定索引位置开始放置。
        /// </summary>
        /// <param name="array"></param>
        /// <param name="arrayIndex"></param>
        public void CopyTo(T[] array, int arrayIndex)
        {
            items.CopyTo(array, arrayIndex);
        }

        /// <summary>
        /// 获取 TableCollection&lt;T&gt; 中实际包含的元素数。
        /// </summary>
        public int Count
        {
            get { return items.Count; }
        }

        public bool IsReadOnly
        {
            get { return false; }
        }

        /// <summary>
        /// 从 TableCollection&lt;T&gt; 中移除特定对象的第一个匹配项。
        /// </summary>
        /// <param name="item"></param>
        /// <returns></returns>
        public bool Remove(T item)
        {
            Table table = item as Table;
            T temp = default(T);
            for (int index = 0; index < items.Count; index++)
            {
                Table _table = items[index] as Table;
                if (_table.TableName.Equals(table.TableName))
                    temp = items[index];
            }
            return items.Remove(temp);
        }

        public IEnumerator<T> GetEnumerator()
        {
            return items.GetEnumerator();
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return items.GetEnumerator();
        }

        public void Sort(Comparison<T> comparison)
        {
            items.Sort(comparison);
        }

        public void Sort(IComparer<T> comparer)
        {
            items.Sort(comparer);
        }

        public void Sort()
        {
            items.Sort();
        }
    }
}
